package com.yc.thread;

/**
 * 函数式接口中只能有1个抽象方法(我们在这里不包括与object的方法重名的方法) ;
 * 可以有从bject继承过来的抽象方法， 因为所有类的最终父类都是0bject ;
 * 接口中唯一:抽象 方法的命名并不重要， 因为函数式接L J就是对某-行为进行抽象，主要目的就是支持L ambda表达式
 * @param <T>
 */
@FunctionalInterface
interface Action<T>{
    void execute(T t);
}

public class Test11_function {
    public static void main(String[] args) {
//        //外部类
//         Action action3= new MyAction();
//         action3.execute("hhhh");

         //匿名内部类
//        Action action4 =new Action() {
//            @Override
//            public void execute(Object o) {
//                System.out.println(o);
//            }
//        };
//        action4.execute("匿名内部类");

        //lanbda语法
        Action action2=(t)->{
            System.out.println(t);
        };
        action2.execute("bye");

        //直接绑定
        Action action =System.out::println;//函数式接口
        action.execute("Hello World");

        //作为参数用
        test(System.out::println, "Hello World");



    }

     static void test(Action action, String str) {
        action.execute(str);
    }
}

//class MyAction implements Action {
//
//    @Override
//    public void execute(Object o) {
//        System.out.println(o);
//    }
//}